﻿#include "EditorMenuBarViewModel.h"

#include "Framework/Editor.h"
#include "Pages/Page.h"
#include "Project/ProjectWindows.h"

#include "Window/EditorWindowGroupModel.h"
#include "Window/EditorWindowGroupViewModel.h"
#include "Window/EditorMainWindowModel.h"

TVector<SEditorContextMenuLine> REditorMenuBarViewModel::GetFileMenu()
{
    TVector<SEditorContextMenuLine> FileMenu;
    
    {
        auto& NewTextFile=FileMenu.Emplace();
        NewTextFile.Text=U"新建文本文件(未实现)";
        NewTextFile.OnClicked=[this]()
        {
            //TODO 新建文本文件,不指定文件路径
        };
    }

    {
        auto& NewFile=FileMenu.Emplace();
        NewFile.Text=U"新建文件(未实现)";
        NewFile.OnClicked=[this]()
        {
            //TODO 新建文件,不指定文件路径
        };
    }

    {
        auto& NewProject=FileMenu.Emplace();
        NewProject.Text=U"新建项目";
        NewProject.OnClicked=[this]()
        {
            WHE::OpenProjectCreateWindow();
        };

    }

    {
        auto& NewWindow=FileMenu.Emplace();
        NewWindow.Text=U"新建窗口(未实现)";
        NewWindow.OnClicked=[this]()
        {
            //TODO 新建窗口
        };
    }

    //分隔符
    {
        auto& spliter=FileMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& OpenFile=FileMenu.Emplace();
        OpenFile.Text=U"打开文件(未实现)";
        OpenFile.OnClicked=[this]()
        {
            //TODO 打开文件
        };
    }

    {
        auto& OpenFolder=FileMenu.Emplace();
        OpenFolder.Text=U"打开项目文件夹";
        OpenFolder.OnClicked=[this]()
        {
            WHE::ImportExistProjectWithFileDialog();
        };
    }

    {
        auto& OpenRecent=FileMenu.Emplace();
        OpenRecent.Text=U"最近打开(未实现)";
        OpenRecent.OnClicked=[this]()
        {
            //TODO 显示子级菜单，最近打开的文件以及文件夹
        };
    }

    //分隔符
    {
        auto& spliter=FileMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& Save=FileMenu.Emplace();
        Save.Text=U"保存(未实现)";
        Save.OnClicked=[this]()
        {
            //TODO 保存当前文件
        };
    }

    {
        auto& SaveAs=FileMenu.Emplace();
        SaveAs.Text=U"另存为(未实现)";
        SaveAs.OnClicked=[this]()
        {
            //TODO 另存当前文件另存
        };
    }

    {
        auto& SaveAll=FileMenu.Emplace();
        SaveAll.Text=U"全部保存(未实现)";
        SaveAll.OnClicked=[this]()
        {
            //TODO 保存所有文件
        };
    }

    //分隔符
    {
        auto& spliter=FileMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& PackageProject=FileMenu.Emplace();
        PackageProject.Text=U"打包项目";
        PackageProject.OnClicked=[this]()
        {
            WHE::OpenPackageProjectPage();
        };
    }

    {
        auto& CPUTimeAnalyze=FileMenu.Emplace();
        CPUTimeAnalyze.Text=U"处理器(CPU)性能分析";
        CPUTimeAnalyze.OnClicked=[this]()
        {
            WHE::OpenCPUTimeAnalyzePage();
        };
    }

    //分隔符
    {
        auto& spliter=FileMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& Options=FileMenu.Emplace();
        Options.Text=U"首选项(未实现)";
        Options.OnClicked=[this]()
        {
            //TODO 打开选项界面
        };
    }

    //分隔符
    {
        auto& spliter=FileMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& CloseFile=FileMenu.Emplace();
        CloseFile.Text=U"关闭文件(未实现)";
        CloseFile.OnClicked=[this]()
        {
            //TODO 关闭当前的文件编辑器
        };
    }

    {
        auto& CloseProject=FileMenu.Emplace();
        CloseProject.Text=U"关闭项目(未实现)";
        CloseProject.OnClicked=[this]()
        {
            //TODO 关闭当前的项目
        };
    }

    {
        auto& CloseWindow=FileMenu.Emplace();
        CloseWindow.Text=U"关闭窗口(未实现)";
        CloseWindow.OnClicked=[this]()
        {
            //TODO 关闭当前的窗口
        };
    }

    //分隔符
    {
        auto& spliter=FileMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& Exit=FileMenu.Emplace();
        Exit.Text=U"退出";
        Exit.OnClicked=[this]()
        {
            REditor::Get()->Exit();
        };
    }



    return FileMenu;
}

TVector<SEditorContextMenuLine> REditorMenuBarViewModel::GetEditMenu()
{
    TVector<SEditorContextMenuLine> EditMenu;
    
    {
        auto& Undo=EditMenu.Emplace();
        Undo.Text=U"撤销";
        Undo.OnClicked=[this]()
        {
            REditorWindowGroupViewModel::Get()->UndoActivedPage();
        };
        Undo.bIsValid=REditorWindowGroupViewModel::Get()->CanUndoActivedPage();
        Undo.ShorcutText=U"Ctrl+Z";
    }

    {
        auto& Redo=EditMenu.Emplace();
        Redo.Text=U"重做";
        Redo.OnClicked=[this]()
        {
            REditorWindowGroupViewModel::Get()->RedoActivedPage();
        };
        Redo.bIsValid=REditorWindowGroupViewModel::Get()->CanRedoActivedPage();
        Redo.ShorcutText=U"Ctrl+Y";
    }

    //分隔符
    {
        auto& spliter=EditMenu.Emplace();
        spliter.bIsSeparator=true;
    }


    auto& Cut=EditMenu.Emplace();
    Cut.Text=U"剪切";
    Cut.OnClicked=[this]()
    {
        REditorWindowGroupViewModel::Get()->CutInActivedPage();
    };
    //TODO 判断是否可以剪切
    Cut.ShorcutText=U"Ctrl+X";

    auto& Copy=EditMenu.Emplace();
    Copy.Text=U"复制";
    Copy.OnClicked=[this]()
    {
        REditorWindowGroupViewModel::Get()->CopyInActivedPage();
    };
    //TODO 判断是否可以复制
    Copy.ShorcutText=U"Ctrl+C";

    auto& Paste=EditMenu.Emplace();
    Paste.Text=U"粘贴";
    Paste.OnClicked=[this]()
    {
        REditorWindowGroupViewModel::Get()->PasteInActivedPage();
    };
    //TODO 判断是否可以粘贴
    Paste.ShorcutText=U"Ctrl+V";

    //分隔符
    {
        auto& spliter=EditMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& Find=EditMenu.Emplace();
        Find.Text=U"查找";
        Find.OnClicked=[this]()
        {
            REditorWindowGroupViewModel::Get()->OpenFindTextDialogInActivedPage();
        };
        //TODO 判断是否可以查找
        Find.ShorcutText=U"Ctrl+F";

    }

    {
        auto& Replace=EditMenu.Emplace();
        Replace.Text=U"替换";
        Replace.OnClicked=[this]()
        {
            REditorWindowGroupViewModel::Get()->OpenReplaceTextDialogInActivedPage();
        };
        //TODO 判断是否可以替换
        Replace.ShorcutText=U"Ctrl+H";
    }

    //分隔符
    {
        auto& spliter=EditMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& FindInFiles=EditMenu.Emplace();
        FindInFiles.Text=U"在文件中查找(未实现)";
        FindInFiles.OnClicked=[this]()
        {
            //TODO 在文件中查找
        };
    }

    {
        auto& ReplaceInFiles=EditMenu.Emplace();
        ReplaceInFiles.Text=U"在文件中替换(未实现)";
        ReplaceInFiles.OnClicked=[this]()
        {
            //TODO 在文件中替换
        };
    }

    //分隔符
    {
        auto& spliter=EditMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    {
        auto& ToggleLineComment=EditMenu.Emplace();
        ToggleLineComment.Text=U"增加或删除行注释(未实现)";
        ToggleLineComment.OnClicked=[this]()
        {
            //TODO 增加或删除行注释
        };
    }

    {
        auto& ToggleBlockComment=EditMenu.Emplace();
        ToggleBlockComment.Text=U"增加或删除块注释(未实现)";
        ToggleBlockComment.OnClicked=[this]()
        {
            //TODO 增加或删除块注释
        };
    }


    return EditMenu;
}

TVector<SEditorContextMenuLine> REditorMenuBarViewModel::GetViewMenu()
{
    TVector<SEditorContextMenuLine> ViewMenu;
    
    auto& ShowToolbar=ViewMenu.Emplace();
    ShowToolbar.Text=U"运行(未实现)";
    ShowToolbar.OnClicked=[this]()
    {
        //TODO 打开调试功能
    };

    //分隔符
    {
        auto& spliter=ViewMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    auto& Output=ViewMenu.Emplace();
    Output.Text=U"输出(未实现)";
    Output.OnClicked=[this]()
    {
        //TODO 打开输出功能界面
    };

    auto& Console=ViewMenu.Emplace();
    Console.Text=U"调试控制台(未实现)";
    Console.OnClicked=[this]()
    {
        //TODO 打开调试控制台
    };

    return ViewMenu;
}

TVector<SEditorContextMenuLine> REditorMenuBarViewModel::GetHelpMenu()
{
    TVector<SEditorContextMenuLine> HelpMenu;
    
    auto& Welcome=HelpMenu.Emplace();
    Welcome.Text=U"欢迎";
    Welcome.OnClicked=[this]()
    {
        WHE::OpenWelcomePage();
    };

    //分隔符
    {
        auto& spliter=HelpMenu.Emplace();
        spliter.bIsSeparator=true;
    }

    auto& About=HelpMenu.Emplace();
    About.Text=U"关于(未实现)";
    About.OnClicked=[this]()
    {
        //TODO 打开关于界面
    };

    return HelpMenu;
}